{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "76374825",
   "metadata": {},
   "source": [
    "# Fichiers CSV\n",
    "\n",
    "Nous avons vu des méthodes pour lire et écrire des fichiers CSV. Elles ont des intérêts pédagogiques car elles vous montrent le fonctionnement de l'ouverture/fermeture de fichiers et vous font travailler l'algorithmique. Ceci étant, à la longue, elles sont relativement pénibles à mettre en oeuvre. Nous allons donc voir comment, avec des dictionnaires et le module `csv`, on peut faciliter tout cela.\n",
    "\n",
    "Le fichier {Download}`presidents.txt<../_static/datas/presidents.txt>` contient les informations suivantes.\n",
    "\n",
    "\n",
    "```\n",
    "Annee;Prenom;Nom\n",
    "1959;Charles;de Gaulle\n",
    "1969;Georges;Pompidou\n",
    "1974;Valéry;Giscard d'Estaing\n",
    "1981;François;Mitterrand\n",
    "1995;Jacques;Chirac\n",
    "2007;Nicolas;Sarkozy\n",
    "2012;François;Hollande\n",
    "2017;Emmanuel;Macron\n",
    "```\n",
    "\n",
    "## Lecture\n",
    "\n",
    "Voici comment importer ces données."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "91113074",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Annee': '1959', 'Prenom': 'Charles', 'Nom': 'de Gaulle'}\n",
      "{'Annee': '1969', 'Prenom': 'Georges', 'Nom': 'Pompidou'}\n",
      "{'Annee': '1974', 'Prenom': 'Valéry', 'Nom': \"Giscard d'Estaing\"}\n",
      "{'Annee': '1981', 'Prenom': 'François', 'Nom': 'Mitterrand'}\n",
      "{'Annee': '1995', 'Prenom': 'Jacques', 'Nom': 'Chirac'}\n",
      "{'Annee': '2007', 'Prenom': 'Nicolas', 'Nom': 'Sarkozy'}\n",
      "{'Annee': '2012', 'Prenom': 'François', 'Nom': 'Hollande'}\n",
      "{'Annee': '2017', 'Prenom': 'Emmanuel', 'Nom': 'Macron'}\n"
     ]
    }
   ],
   "source": [
    "import csv\n",
    "with open(\"../_static/datas/presidents.txt\", mode=\"r\") as f :\n",
    "    reader = csv.DictReader(f, delimiter=\";\")\n",
    "    for row in reader:\n",
    "        print(row)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58f40b9a",
   "metadata": {},
   "source": [
    "On ouvre le fichier `president.txt` avec la fonction `open` comme on le fait toujours. On passe le fichier ouvert à la fonction `csv.DictReader` qui permet d'analyse le fichier comme du `csv`. On obtient alors un itérateur que l'on peut utiliser dans une boucle for.\n",
    "\n",
    "Chaque ligne lu est analysé automatiquement (en fonction du délimiteur, ici `;`) et on récupère un ensemble de dictionnaires.\n",
    "\n",
    "Par défaut, les noms de colonnes sont définies à partir de la première ligne du fichier csv. On peut changer se comportement en précisant le paramètre `fieldnames` qui prend une liste de chaines de caractères. Attention alors à la première ligne..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "48a2a178",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Un': 'Annee', 'Deux': 'Prenom', 'Trois': 'Nom'}\n",
      "{'Un': '1959', 'Deux': 'Charles', 'Trois': 'de Gaulle'}\n",
      "{'Un': '1969', 'Deux': 'Georges', 'Trois': 'Pompidou'}\n",
      "{'Un': '1974', 'Deux': 'Valéry', 'Trois': \"Giscard d'Estaing\"}\n",
      "{'Un': '1981', 'Deux': 'François', 'Trois': 'Mitterrand'}\n",
      "{'Un': '1995', 'Deux': 'Jacques', 'Trois': 'Chirac'}\n",
      "{'Un': '2007', 'Deux': 'Nicolas', 'Trois': 'Sarkozy'}\n",
      "{'Un': '2012', 'Deux': 'François', 'Trois': 'Hollande'}\n",
      "{'Un': '2017', 'Deux': 'Emmanuel', 'Trois': 'Macron'}\n"
     ]
    }
   ],
   "source": [
    "with open(\"../_static/datas/presidents.txt\", mode=\"r\") as f :\n",
    "    reader = csv.DictReader(f, delimiter=\";\", fieldnames=[\"Un\", \"Deux\", \"Trois\"])\n",
    "    for row in reader:\n",
    "        print(row)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33905f8d",
   "metadata": {},
   "source": [
    "## Écriture\n",
    "\n",
    "Là encore, l'export des données se trouve bien facilité. Vous devriez être convaincu que les dictionnaires sont un outil très performent."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "43412337",
   "metadata": {},
   "outputs": [],
   "source": [
    "import csv\n",
    "\n",
    "with open('../_static/datas/presidents_out.txt', 'w', newline='') as csvfile:\n",
    "    fieldnames = ['Prenom', 'Nom']\n",
    "    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)\n",
    "\n",
    "    writer.writeheader()\n",
    "    writer.writerow({'Prenom': 'Charles', 'Nom': 'de Gaulle'})\n",
    "    writer.writerow({'Prenom': 'Georges', 'Nom': 'Pompidou'})\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67116f8f",
   "metadata": {},
   "source": [
    "## Exercice\n",
    "\n",
    "Reprenons maintenant la carte des plus grande villes de France, nous devrions pouvoir tout reprendre pour intégrer les dictionnaires et la lecture/écriture avec le module `csv`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c45fc9c1",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
